// 路由权限控制模块
import { Notify, Loading } from 'quasar'
import { getToken, tokenKey } from '@/utils/auth'
import { isHttp } from '@/utils/validate'
import { isRelogin } from '@/utils/request'
import useUserStore from '@/stores/modules/user'
import useSettingsStore from '@/stores/modules/settings'
import usePermissionStore from '@/stores/modules/permission'

// 免登录白名单路径
const whiteList = ['/login', '/register']

export default async ({ app, router }) => {
  // 全局路由前置守卫
  router.beforeEach((to, from, next) => {
    // 显示页面加载状态
    Loading.show()

    // 已登录状态处理
    if (getToken(tokenKey.access)) {
      // 设置页面标题
      to.meta.title && useSettingsStore().setTitle(to.meta.title)

      // 已登录时访问登录页则跳转首页
      if (to.path === '/login') {
        next({ path: '/' })
        Loading.hide()
      }
      // 白名单路径直接放行
      else if (whiteList.indexOf(to.path) !== -1) {
        next()
      }
      // 需要权限验证的路径
      else {
        // 首次加载需要获取用户信息
        if (useUserStore().roles.length === 0) {
          isRelogin.show = true

          // 获取用户信息
          useUserStore().getInfo().then(() => {
            isRelogin.show = false

            // 根据角色生成动态路由
            usePermissionStore().generateRoutes().then(accessRoutes => {
              // 添加动态路由
              accessRoutes.forEach(route => {
                if (!isHttp(route.path)) {
                  router.addRoute(route)
                }
              })

              // 确保路由添加完成后跳转
              next({ ...to, replace: true })
            })
          }).catch(err => {
            // 用户信息获取失败处理
            useUserStore().fadeOut().then(() => {
              Notify.create({
                type: 'negative',
                message: err,
                position: 'top'
              })
              next({ path: '/' })
            })
          })
        } else {
          // 已有用户信息直接放行
          next()
        }
      }
    }
    // 未登录状态处理
    else {
      // 白名单路径直接放行
      if (whiteList.indexOf(to.path) !== -1) {
        next()
      } else {
        // 重定向到登录页并记录原路径
        next(`/login?redirect=${to.fullPath}`)
        Loading.hide()
      }
    }
  })

  // 全局路由后置钩子
  router.afterEach(() => {
    // 隐藏页面加载状态
    Loading.hide()
  })
}
